package com.example.demo.domain.repository;

import com.example.demo.domain.Ticket;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface TicketRepository extends JpaRepository<Ticket,Integer> {

    //    获取各审核人员应审核的票据相关方法
    //
    //
    //
    //
    /**
     * @Description: 获取全部待审核票据
     * @Param:  process: 审核进程
     * @return:  全部票据列表
     * @Author: wangze
     */
    List<Ticket> findByEmployeeNameContainingAndCheckProcessOrDepartmentContainingAndCheckProcessOrderByDateAsc(
            String keyword1,Integer process1,
            String keyword2,Integer process2);

    /**
     * @Description: 根据职工姓名查找待审核票据
     * @Param: 关键字
     * @return: 特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByEmployeeNameContainingAndCheckProcessOrderByDateAsc(String employee_name,Integer process);

    /**
     * @Description: 根据员工部门查找未审核票据
     * @Param:  关键字
     * @return:  特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByDepartmentContainingAndCheckProcessOrderByDateAsc(String department,Integer process);

    //     获取审核中票据列表相关方法
    //
    //
    //
    //
    /**
     * @Description: 获取审核中票据列表
     * @return:  审核中票据列表
     * @Author: wangze
     */
    List<Ticket> findByDepartmentContainingAndCheckProcessNotOrEmployeeNameContainingAndCheckProcessNotOrderByDateDesc(
            String keyword1,Integer process1,
            String keyword2,Integer process2);

    /**
     * @Description: 根据职工姓名查找审核中票据列表
     * @Param: employee_name: 职工姓名
     *          process: 审核进程
     * @return: 特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByEmployeeNameContainingAndCheckProcessNotOrderByDateDesc(String employee_name,Integer process);

    /**
     * @Description: 根据职工部门查找审核中票据列表
     * @Param:  department: 职工部门
     *          process: 审核进程
     * @return:  特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByDepartmentContainingAndCheckProcessNotOrderByDateDesc(String department,Integer process);


    //     获取已通过或已驳回票据列表相关方法
    //
    //
    //
    //
    /**
     * @Description: 获取已通过或已驳回票据列表
     * @return:  已通过或已驳回票据列表
     * @Author: wangze
     */
    List<Ticket> findByDepartmentContainingAndCheckProcessAndStateOrEmployeeNameContainingAndCheckProcessAndStateOrderByDateDesc(
            String keyword1,Integer process1,String state1,
            String keyword2,Integer process2,String state2);

    /**
     * @Description: 根据职工姓名查找已通过或已驳回票据列表
     * @Param: employee_name: 职工姓名
     *          process: 审核进程
     *          state: 审核结果
     * @return: 特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByEmployeeNameContainingAndCheckProcessAndStateOrderByDateDesc(String employee_name,Integer process,String state);

    /**
     * @Description: 根据职工部门查找已通过或已驳回票据列表
     * @Param: department: 职工部门
     *         process: 审核进程
     *         state: 审核结果
     * @return:  特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByDepartmentContainingAndCheckProcessAndStateOrderByDateDesc(String department,Integer process,String state);

    /**
     * @Description: 获取已通过票据列表以便进行统计
     * @Param: process: 审核进程
     *         state: 审核结果
     * @return:  特定搜索列表
     * @Author: wangze
     */
    List<Ticket> findByCheckProcessAndStateOrderByDateDesc(Integer process,String state);

    // 票据增删改查相关方法
    //
    //
    //
    //
    /**
     * @Description: 通过票据ID查找相应票据
     * @Param:  id：票据ID
     * @return:  特定票据
     * @Author: wangze
     */
    Ticket getTicketById(Integer id);

    /**
     * @Description: 通过票据ID删除相应票据
     * @Param:  id：票据ID
     * @return:  无
     * @Author: wangze
     */
    @Transactional
    @Modifying
    void deleteTicketById(Integer id);



    /**
     * @Description: 根据用户工号查询已审核票据列表(小程序端)
     * @Param:  worknumber: 用户工号
     * @Param: process: 标志审核进行到了哪个流程
     * @return:  票据列表
     * @Author: wangze
     */
    List<Ticket> findByWorkNumberAndCheckProcessOrderByDateDesc(String worknumber,Integer process);

    /**
     * @Description: 根据用户工号查询审核中票据列表(小程序端)
     * @Param:  worknumber: 用户工号
     * @Param:  process: 标志审核进行到了哪个流程
     * @return: 票据列表
     * @Author: wangze
     */
    List<Ticket> findByWorkNumberAndCheckProcessNotOrderByDateDesc(String worknumber,Integer process);
}
